package com.bbva.itradecomex.bo.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bbva.itradecomex.bo.iface.RelacionPaisesBO;
import com.bbva.itradecomex.dao.iface.VistaClienteDAO;
import com.bbva.itradecomex.domain.ClienteRelacionPaisDetalle;
import com.bbva.itradecomex.domain.ClienteRelacionPaisResultado;
import com.bbva.itradecomex.form.RelacionPaisBusquedaForm;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;

@Service
public class RelacionPaisesBOImpl implements RelacionPaisesBO {

	@Autowired
	private VistaClienteDAO vistaClienteDAO;

	@Override
	public List<ClienteRelacionPaisResultado> getListRankingPaisImport(RelacionPaisBusquedaForm formulario) throws Exception {
		return formatListRankingPais(vistaClienteDAO.getListCResultadoPaisDetImp(formulario));
	}
	@Override
	public List<ClienteRelacionPaisResultado> getListRankingPaisExport(RelacionPaisBusquedaForm formulario)
			throws Exception {
		return formatListRankingPais(vistaClienteDAO.getListCResultadoPaisDetExp(formulario));
	}

	@Override
	public List<ClienteRelacionPaisResultado> getListRankingPaisImpExp(RelacionPaisBusquedaForm formulario)
			throws Exception {
		return formatListRankingPais(vistaClienteDAO.getListCResultadoPaisDetImpExp(formulario));
	}
	
	@Override
	public void setearTotales(
			ClienteRelacionPaisResultado subTotalPaisConClave,
			ClienteRelacionPaisResultado subTotalPaisSinClaveImp,
			ClienteRelacionPaisResultado totalPaisImp,
			List<ClienteRelacionPaisResultado> listaBPaisResultadoImportaciones)
			throws Exception {
		// Importaciones
		// SubTotalPaisImpesConCLave && SubTotalPaisImpesSinCLave
		for (ClienteRelacionPaisResultado bRelacPaisResIter : listaBPaisResultadoImportaciones) {
			for(ClienteRelacionPaisDetalle bRelacPaisDetaIter: bRelacPaisResIter.getListaClaves()){
				if(bRelacPaisDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_CON_CLAVE)){
					
					subTotalPaisConClave.settMpBcos(subTotalPaisConClave.gettMpBcos().add(bRelacPaisDetaIter.getTotBcos()));
					subTotalPaisConClave.settMpOper(subTotalPaisConClave.gettMpOper().add(bRelacPaisDetaIter.getTotOper()));
					subTotalPaisConClave.settMpImpUSD(subTotalPaisConClave.gettMpImpUSD().add(bRelacPaisDetaIter.getTotImporte()));
					subTotalPaisConClave.setiTeBcos(subTotalPaisConClave.getiTeBcos().add(bRelacPaisDetaIter.getTxBcos()));
					subTotalPaisConClave.setiTeOper(subTotalPaisConClave.getiTeOper().add(bRelacPaisDetaIter.getTxOper()));
					subTotalPaisConClave.setiTeImpUSD(subTotalPaisConClave.getiTeImpUSD().add(bRelacPaisDetaIter.getTxImporte()));
					subTotalPaisConClave.setiCcBcos(subTotalPaisConClave.getiCcBcos().add(bRelacPaisDetaIter.getLcBcos()));
					subTotalPaisConClave.setiCcOper(subTotalPaisConClave.getiCcOper().add(bRelacPaisDetaIter.getLcOper()));
					subTotalPaisConClave.setiCcImpUSD(subTotalPaisConClave.getiCcImpUSD().add(bRelacPaisDetaIter.getLcImporte()));
					subTotalPaisConClave.setiCoBcos(subTotalPaisConClave.getiCoBcos().add(bRelacPaisDetaIter.getClBcos()));
					subTotalPaisConClave.setiCoOper(subTotalPaisConClave.getiCoOper().add(bRelacPaisDetaIter.getClOper()));
					subTotalPaisConClave.setiCoImpUSD(subTotalPaisConClave.getiCoImpUSD().add(bRelacPaisDetaIter.getClImporte()));
					subTotalPaisConClave.setiFinOper(subTotalPaisConClave.getiFinOper().add(bRelacPaisDetaIter.getFiOper()));
					subTotalPaisConClave.setiFinImpUSD(subTotalPaisConClave.getiFinImpUSD().add(bRelacPaisDetaIter.getFiImporte()));
				}else if(bRelacPaisDetaIter.getTipo().toUpperCase().equals(Constantes.VBANCO_TIPO_SIN_CLAVE)){
					subTotalPaisSinClaveImp.settMpBcos(subTotalPaisSinClaveImp.gettMpBcos().add(bRelacPaisDetaIter.getTotBcos()));
					subTotalPaisSinClaveImp.settMpOper(subTotalPaisSinClaveImp.gettMpOper().add(bRelacPaisDetaIter.getTotOper()));
					subTotalPaisSinClaveImp.settMpImpUSD(subTotalPaisSinClaveImp.gettMpImpUSD().add(bRelacPaisDetaIter.getTotImporte()));
					subTotalPaisSinClaveImp.setiTeBcos(subTotalPaisSinClaveImp.getiTeBcos().add(bRelacPaisDetaIter.getTxBcos()));
					subTotalPaisSinClaveImp.setiTeOper(subTotalPaisSinClaveImp.getiTeOper().add(bRelacPaisDetaIter.getTxOper()));
					subTotalPaisSinClaveImp.setiTeImpUSD(subTotalPaisSinClaveImp.getiTeImpUSD().add(bRelacPaisDetaIter.getTxImporte()));
					subTotalPaisSinClaveImp.setiCcBcos(subTotalPaisSinClaveImp.getiCcBcos().add(bRelacPaisDetaIter.getLcBcos()));
					subTotalPaisSinClaveImp.setiCcOper(subTotalPaisSinClaveImp.getiCcOper().add(bRelacPaisDetaIter.getLcOper()));
					subTotalPaisSinClaveImp.setiCcImpUSD(subTotalPaisSinClaveImp.getiCcImpUSD().add(bRelacPaisDetaIter.getLcImporte()));
					subTotalPaisSinClaveImp.setiCoBcos(subTotalPaisSinClaveImp.getiCoBcos().add(bRelacPaisDetaIter.getClBcos()));
					subTotalPaisSinClaveImp.setiCoOper(subTotalPaisSinClaveImp.getiCoOper().add(bRelacPaisDetaIter.getClOper()));
					subTotalPaisSinClaveImp.setiCoImpUSD(subTotalPaisSinClaveImp.getiCoImpUSD().add(bRelacPaisDetaIter.getClImporte()));
					subTotalPaisSinClaveImp.setiFinOper(subTotalPaisSinClaveImp.getiFinOper().add(bRelacPaisDetaIter.getFiOper()));
					subTotalPaisSinClaveImp.setiFinImpUSD(subTotalPaisSinClaveImp.getiFinImpUSD().add(bRelacPaisDetaIter.getFiImporte()));
				}
			}
		}
		
		// Total Pais
		for (ClienteRelacionPaisResultado cRelacPaisResIter : listaBPaisResultadoImportaciones) {
				
			totalPaisImp.settMpBcos(totalPaisImp.gettMpBcos().add(cRelacPaisResIter.gettMpBcos()));
			totalPaisImp.settMpOper(totalPaisImp.gettMpOper().add(cRelacPaisResIter.gettMpOper()));
			totalPaisImp.settMpImpUSD(totalPaisImp.gettMpImpUSD().add(cRelacPaisResIter.gettMpImpUSD()));
			totalPaisImp.setiTeBcos(totalPaisImp.getiTeBcos().add(cRelacPaisResIter.getiTeBcos()));
			totalPaisImp.setiTeOper(totalPaisImp.getiTeOper().add(cRelacPaisResIter.getiTeOper()));
			totalPaisImp.setiTeImpUSD(totalPaisImp.getiTeImpUSD().add(cRelacPaisResIter.getiTeImpUSD()));
			totalPaisImp.setiCcBcos(totalPaisImp.getiCcBcos().add(cRelacPaisResIter.getiCcBcos()));
			totalPaisImp.setiCcOper(totalPaisImp.getiCcOper().add(cRelacPaisResIter.getiCcOper()));
			totalPaisImp.setiCcImpUSD(totalPaisImp.getiCcImpUSD().add(cRelacPaisResIter.getiCcImpUSD()));
			totalPaisImp.setiCoBcos(totalPaisImp.getiCoBcos().add(cRelacPaisResIter.getiCoBcos()));
			totalPaisImp.setiCoOper(totalPaisImp.getiCoOper().add(cRelacPaisResIter.getiCoOper()));
			totalPaisImp.setiCoImpUSD(totalPaisImp.getiCoImpUSD().add(cRelacPaisResIter.getiCoImpUSD()));
			totalPaisImp.setiFinOper(totalPaisImp.getiFinOper().add(cRelacPaisResIter.getiFinOper()));
			totalPaisImp.setiFinImpUSD(totalPaisImp.getiFinImpUSD().add(cRelacPaisResIter.getiFinImpUSD()));
		}
	}
	

	private List<ClienteRelacionPaisResultado> formatListRankingPais(
			List<ClienteRelacionPaisDetalle> listCRelacPaisDet) {
		List<ClienteRelacionPaisResultado> lstCPaisResultado = null;
		List<ClienteRelacionPaisDetalle> listaClaves = new ArrayList<ClienteRelacionPaisDetalle>() ;
		if (listCRelacPaisDet != null) {
			lstCPaisResultado = new ArrayList<ClienteRelacionPaisResultado>();
			
			BigDecimal totalBcos = new BigDecimal(0);
			BigDecimal totalOper = new BigDecimal(0);
			BigDecimal totalImporte = new BigDecimal(0);
			BigDecimal iTeBcos = new BigDecimal(0);
			BigDecimal iTeOper = new BigDecimal(0);
			BigDecimal iTeImpUSD = new BigDecimal(0);
			BigDecimal iCcBcos = new BigDecimal(0);
			BigDecimal iCcOper = new BigDecimal(0);
			BigDecimal iCcImpUSD = new BigDecimal(0);
			BigDecimal iCBcos = new BigDecimal(0);
			BigDecimal iCOper = new BigDecimal(0);
			BigDecimal iCImpUSD = new BigDecimal(0);
			BigDecimal iFOper = new BigDecimal(0);
			BigDecimal iFImpUSD = new BigDecimal(0);
			ClienteRelacionPaisDetalle tmpCRelacPaisDetSig=new ClienteRelacionPaisDetalle();

			// 02.Se arma el subListado
			for (int i = 0; i < listCRelacPaisDet.size(); i++) {
				ClienteRelacionPaisDetalle cRelacPaisDetalle = listCRelacPaisDet.get(i);
				if(i < (listCRelacPaisDet.size()-1))
					tmpCRelacPaisDetSig=listCRelacPaisDet.get(i+1);
				
				totalBcos=totalBcos.add(cRelacPaisDetalle.getTotBcos());
				totalOper=totalOper.add(cRelacPaisDetalle.getTotOper());
				totalImporte=totalImporte.add(cRelacPaisDetalle.getTotImporte());
				iTeBcos=iTeBcos.add(cRelacPaisDetalle.getTxBcos());
				iTeOper=iTeOper.add(cRelacPaisDetalle.getTxOper());
				iTeImpUSD=iTeImpUSD.add(cRelacPaisDetalle.getTxImporte());
				iCcBcos=iCcBcos.add(cRelacPaisDetalle.getLcBcos());
				iCcOper=iCcOper.add(cRelacPaisDetalle.getLcOper());
				iCcImpUSD=iCcImpUSD.add(cRelacPaisDetalle.getLcImporte());
				iCBcos=iCBcos.add(cRelacPaisDetalle.getClBcos());
				iCOper=iCOper.add(cRelacPaisDetalle.getClOper());
				iCImpUSD=iCImpUSD.add(cRelacPaisDetalle.getClImporte());
				iFOper=iFOper.add(cRelacPaisDetalle.getFiOper());
				iFImpUSD=iFImpUSD.add(cRelacPaisDetalle.getFiImporte());
				listaClaves.add(cRelacPaisDetalle);
				
				if (!tmpCRelacPaisDetSig.getCodPais().equals(cRelacPaisDetalle.getCodPais()) || i==(listCRelacPaisDet.size()-1) ) {
					ClienteRelacionPaisResultado cRelacPaisResultado = new ClienteRelacionPaisResultado(
							cRelacPaisDetalle.getCodPais(),
							cRelacPaisDetalle.getDescPais(), 
							totalBcos, totalOper, totalImporte, iTeBcos,
							iTeOper, iTeImpUSD, iCcBcos, iCcOper, iCcImpUSD,
							iCBcos, iCOper, iCImpUSD, iFOper, iFImpUSD);
					cRelacPaisResultado.setListaClaves(listaClaves);
					lstCPaisResultado.add(cRelacPaisResultado);
					
					totalBcos = new BigDecimal(0);
					totalOper = new BigDecimal(0);
					totalImporte = new BigDecimal(0);
					iTeBcos = new BigDecimal(0);
					iTeOper = new BigDecimal(0);
					iTeImpUSD = new BigDecimal(0);
					iCcBcos = new BigDecimal(0);
					iCcOper = new BigDecimal(0);
					iCcImpUSD = new BigDecimal(0);
					iCBcos = new BigDecimal(0);
					iCOper = new BigDecimal(0);
					iCImpUSD = new BigDecimal(0);
					iFOper = new BigDecimal(0);
					iFImpUSD = new BigDecimal(0);
					listaClaves = new ArrayList<ClienteRelacionPaisDetalle>();
				}
			}
		}
		return lstCPaisResultado;
	}
	
	@Override
	public void generaPDFRankingPais(
			Integer impoExpo,
			FacesContext facesContext,
			List<ClienteRelacionPaisResultado> listaCPaisResultadoImportaciones,
			RelacionPaisBusquedaForm filtros,
			ClienteRelacionPaisResultado subTotalPaisConClave,
			ClienteRelacionPaisResultado subTotalPaisSinClave,
			ClienteRelacionPaisResultado totales,String strTipoArchivoExportacion) throws Exception {

		Map<String,Object> parametros = new HashMap<String, Object>();
		String strNombrePDF = "Relacion_Paises_";	
		parametros.put("titulo","RELACION PAISES");
		if (impoExpo==Constantes.TIPO_IMPORTACION_VAL){
			parametros.put("expoImpo","IMPORTACIONES");
			strNombrePDF+="IMPO_";
		}
		else if(impoExpo==Constantes.TIPO_EXPORTACION_VAL){
			parametros.put("expoImpo","EXPORTACIONES");
			strNombrePDF+="EXPO_";
		}
		else if(impoExpo==Constantes.TIPO_IMPOEXPO_VAL){
			parametros.put("expoImpo","IMPORTACIONES Y EXPORTACIONES");
			strNombrePDF+="IMPOEXPO_";
		}
		parametros.put("filPais",filtros.getStrCodPais());
		parametros.put("filDescPais",filtros.getStrDescPais());
		parametros.put("filClave",filtros.getStrExcluClave());
		parametros.put("filGrupo",filtros.getStrExcluGrupo());
		parametros.put("filFechaIni",filtros.getDtFechaIni());
		parametros.put("filFechaFin",filtros.getDtFechaFin());
		if(filtros.getLngTopPais()!=null && filtros.getLngTopPais() > 0)
			parametros.put("filTopBanco",filtros.getLngTopPais());
		parametros.put("filAladi",filtros.getStrExcluOpera());
		parametros.put("cliNombre",filtros.getClienteDatos().getStrNomCliente());
		parametros.put("cliTipoDoc",filtros.getClienteDatos().getStrTipDocumento());
		parametros.put("cliSegmento",filtros.getClienteDatos().getStrDescSegmento());
		parametros.put("cliGestPrinc",filtros.getClienteDatos().getStrDescGestPrincipal());
		parametros.put("cliCodigo",filtros.getClienteDatos().getStrCodCliente());
		parametros.put("cliNroDoc",filtros.getClienteDatos().getStrNumDocumento());
		parametros.put("cliOficPrinc",filtros.getClienteDatos().getStrDescOficPrincipal());
		
		if(totales==null)totales=new ClienteRelacionPaisResultado();

		parametros.put("subTotalConClaveBcos",subTotalPaisConClave.gettMpBcos());
		parametros.put("subTotalConClaveOper",subTotalPaisConClave.gettMpOper());
		parametros.put("subTotalConClaveImporte",subTotalPaisConClave.gettMpImpUSD());
		parametros.put("subTotalConClaveTeBcos",subTotalPaisConClave.getiTeBcos());
		parametros.put("subTotalConClaveTeOper",subTotalPaisConClave.getiTeOper());
		parametros.put("subTotalConClaveiTeImpUSD",subTotalPaisConClave.getiTeImpUSD());
		parametros.put("subTotalConClaveiCcBcos",subTotalPaisConClave.getiCcBcos());
		parametros.put("subTotalConClaveiCcOper",subTotalPaisConClave.getiCcOper());
		parametros.put("subTotalConClaveiCcImpUSD",subTotalPaisConClave.getiCcImpUSD());
		parametros.put("subTotalConClaveiCBcos",subTotalPaisConClave.getiCoBcos());
		parametros.put("subTotalConClaveiCOper",subTotalPaisConClave.getiCoOper());
		parametros.put("subTotalConClaveiCImpUSD",subTotalPaisConClave.getiCoImpUSD());
		parametros.put("subTotalConClaveiFOper",subTotalPaisConClave.getiFinOper());
		parametros.put("subTotalConClaveiFImpUSD",subTotalPaisConClave.getiFinImpUSD());
				
		parametros.put("subTotalSinClaveBcos",subTotalPaisSinClave.gettMpBcos());
		parametros.put("subTotalSinClaveOper",subTotalPaisSinClave.gettMpOper());
		parametros.put("subTotalSinClaveImporte",subTotalPaisSinClave.gettMpImpUSD());
		parametros.put("subTotalSinClaveTeBcos",subTotalPaisSinClave.getiTeBcos());
		parametros.put("subTotalSinClaveTeOper",subTotalPaisSinClave.getiTeOper());
		parametros.put("subTotalSinClaveiTeImpUSD",subTotalPaisSinClave.getiTeImpUSD());
		parametros.put("subTotalSinClaveiCcBcos",subTotalPaisSinClave.getiCcBcos());
		parametros.put("subTotalSinClaveiCcOper",subTotalPaisSinClave.getiCcOper());
		parametros.put("subTotalSinClaveiCcImpUSD",subTotalPaisSinClave.getiCcImpUSD());
		parametros.put("subTotalSinClaveiCBcos",subTotalPaisSinClave.getiCoBcos());
		parametros.put("subTotalSinClaveiCOper",subTotalPaisSinClave.getiCoOper());
		parametros.put("subTotalSinClaveiCImpUSD",subTotalPaisSinClave.getiCoImpUSD());
		parametros.put("subTotalSinClaveiFOper",subTotalPaisSinClave.getiFinOper());
		parametros.put("subTotalSinClaveiFImpUSD",subTotalPaisSinClave.getiFinImpUSD());
		
		parametros.put("totalBcos",totales.gettMpBcos());
		parametros.put("totalOper",totales.gettMpOper());
		parametros.put("totalImporte",totales.gettMpImpUSD());
		parametros.put("totalTeBcos",totales.getiTeBcos());
		parametros.put("totalTeOper",totales.getiTeOper());
		parametros.put("totaliTeImpUSD",totales.getiTeImpUSD());
		parametros.put("totaliCcBcos",totales.getiCcBcos());
		parametros.put("totaliCcOper",totales.getiCcOper());
		parametros.put("totaliCcImpUSD",totales.getiCcImpUSD());
		parametros.put("totaliCBcos",totales.getiCoBcos());
		parametros.put("totaliCOper",totales.getiCoOper());
		parametros.put("totaliCImpUSD",totales.getiCoImpUSD());
		parametros.put("totaliFOper",totales.getiFinOper());
		parametros.put("totaliFImpUSD",totales.getiFinImpUSD());
		
		strNombrePDF=strNombrePDF+"_"+ITradexUtil.convertUtilDateToString(new Date(), Constantes.FORMAT_DATE_MM_DD_yyyy);
		if (strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_PDF)){
			ITradexUtil.exportPDF(parametros, listaCPaisResultadoImportaciones, "/xmlReport/cliente/relacionPais/relacionPaises.jasper", strNombrePDF);	
		}else if(strTipoArchivoExportacion.equals(Constantes.TIPO_ARCHIVO_EXPORTACION_XLS)){
			parametros.put("listaCPaisResultadoImportaciones",listaCPaisResultadoImportaciones);
			ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/cliente/relacionPais/relacionPaises_Excel.jasper", strNombrePDF);
		}
	}
}